consolidate handling of extensions in gpx writer. (#1200)
authortsteven4 <13596209+tsteven4@users.noreply.github.com>
Mon, 30 Oct 2023 00:35:42 +0000 (18:35 -0600)
committerGitHub <noreply@github.com>
Mon, 30 Oct 2023 00:35:42 +0000 (18:35 -0600)
This is a user visible change.

Previously if gARmIN sPECIAL dATA existed and both garminextensions
and humminbirdextensions were false then the gpx writer would
write a subset if it (and not passthrough any gpx -> gpx data.)
If gARmIN sPECIAL dATA existed and either extension option was true,
then a different subset would be written (and any gpx -> gpx data would
not be passed through.)  Now the garminextensions option must
used to have any gARmIN sPECIAL dATA data written.

Previously, when passing through extension data from the gpx reader to
the gpx writer, some elements of the garmin and humminbird extensions
were not included. Now, all foreign elements are included. As before,
passthrough is only used when both extension options are false.

garmin_fs.cc
garmin_fs.h
gpx.cc
gpx.h
reference/basecamp~gpx.gpx
reference/gdb-sample-v3-ilinks.gpx
reference/multiple-links.gpx
reference/umsonstdraussen.gpx
testo.d/garmin_gpi.test

index c6846efcec0c8277d72db7dd53483aa0df9a55a2..d00f4a0c36aea6ed7ca2a02a8686905681606e43 100644 (file)
@@ -78,72 +78,6 @@ garmin_fs_t::~garmin_fs_t()
 
 /* GPX - out */
 
-void
-garmin_fs_xml_fprint(const Waypoint* waypt,
-                     gpsbabel::XmlStreamWriter* writer)
-{
-  garmin_fs_t* gmsd = garmin_fs_t::find(waypt);
-
-  writer->stackOptionalStartElement(QStringLiteral("extensions"));
-  writer->stackOptionalStartElement(QStringLiteral("gpxx:WaypointExtension"));
-  writer->stackNamespace(QStringLiteral("http://www.garmin.com/xmlschemas/GpxExtensions/v3"),
-                         "gpxx");
-
-  if (waypt->proximity_has_value()) {
-    writer->stackTextElement(QStringLiteral("gpxx:Proximity"), QString::number(waypt->proximity_value(), 'f', 6));
-  }
-
-  if (waypt->temperature_has_value()) {
-    writer->stackTextElement(QStringLiteral("gpxx:Temperature"), QString::number(waypt->temperature_value(), 'f', 6));
-  }
-
-  if (waypt->depth_has_value()) {
-    writer->stackTextElement(QStringLiteral("gpxx:Depth"), QString::number(waypt->depth_value(), 'f', 6));
-  }
-
-  if (garmin_fs_t::has_display(gmsd)) {
-    const char* cx;
-    switch (gmsd->display) {
-    case gt_display_mode_symbol:
-      cx = "SymbolOnly";
-      break;
-    case gt_display_mode_symbol_and_comment:
-      cx = "SymbolAndDescription";
-      break;
-    default:
-      cx = "SymbolAndName";
-      break;
-    }
-    writer->stackTextElement(QStringLiteral("gpxx:DisplayMode"), cx);
-  }
-
-  if (garmin_fs_t::has_category(gmsd)) {
-    uint16_t cx = gmsd->category;
-    writer->stackStartElement(QStringLiteral("gpxx:Categories"));
-    for (int i = 0; i < 16; i++) {
-      if (cx & 1) {
-        writer->stackTextElement(QStringLiteral("gpxx:Category"), QStringLiteral("Category %1").arg(i+1));
-      }
-      cx = cx >> 1;
-    }
-    writer->stackEndElement(); // gpxx:Categories
-  }
-
-  writer->stackOptionalStartElement(QStringLiteral("gpxx:Address"));
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:StreetAddress"), garmin_fs_t::get_addr(gmsd, nullptr));
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:City"), garmin_fs_t::get_city(gmsd, nullptr));
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:State"), garmin_fs_t::get_state(gmsd, nullptr));
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:Country"), garmin_fs_t::get_country(gmsd, nullptr));
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:PostalCode"), garmin_fs_t::get_postal_code(gmsd, nullptr));
-  writer->stackEndElement(); // gpxx:Address
-
-  writer->stackOptionalTextElement(QStringLiteral("gpxx:PhoneNumber"), garmin_fs_t::get_phone_nr(gmsd, nullptr));
-
-
-  writer->stackEndElement(); // gpxx:WaypointExtension
-  writer->stackEndElement(); // extensions
-}
-
 void
 garmin_fs_xml_convert(const int base_tag, int tag, const QString& qstr, Waypoint* waypt)
 {
index d225339dc72e7a8f89a6aa9fe625f03cf41b9799..fb39b5b90ce2b20a860545f2a6cef630a48d4869 100644 (file)
@@ -221,7 +221,6 @@ void garmin_fs_copy(void** dest, const void* src);
 
 /* for GPX */
 void garmin_fs_xml_convert(int base_tag, int tag, const QString& qstr, Waypoint* waypt);
-void garmin_fs_xml_fprint(const Waypoint* waypt, gpsbabel::XmlStreamWriter*);
 
 /* common garmin_fs utilities */
 
diff --git a/gpx.cc b/gpx.cc
index ad5bfcaaa939118726eca8231403e738ebb8dbc4..45c7606e5bf49b8864247cb3d3a003c0e3dec983 100644 (file)
--- a/gpx.cc
+++ b/gpx.cc
@@ -47,7 +47,7 @@
 #include <QtGlobal>                         // for qAsConst, QAddConst<>::Type
 
 #include "defs.h"
-#include "garmin_fs.h"                      // for garmin_fs_xml_convert, garmin_fs_xml_fprint, GMSD_FIND
+#include "garmin_fs.h"                      // for garmin_fs_t, garmin_ilink_t, garmin_fs_xml_convert
 #include "garmin_tables.h"                  // for gt_color_index_by_rgb, gt_color_name, gt_color_value_by_name
 #include "geocache.h"                       // for Geocache, Geocache::UtfSt...
 #include "mkshort.h"                        // for MakeShort
@@ -1266,7 +1266,6 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin
 {
   assert(gpx_write_version >= gpx_1_1);
 
-
   writer->stackOptionalStartElement(QStringLiteral("extensions"));
 
   if (opt_humminbirdext) {
@@ -1283,6 +1282,7 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin
     // Although not required by the schema we assume that gpxx:RoutePointExtension must be a child of gpx:rtept.
     // Although not required by the schema we assume that gpxx:TrackPointExtension must be a child of gpx:trkpt.
     // Although not required by the schema we assume that gpxtpx:TrackPointExtension must be a child of gpx:trkpt.
+    garmin_fs_t* gmsd = garmin_fs_t::find(waypointp);
     switch (point_type) {
     case gpxpt_waypoint:
       writer->stackOptionalStartElement(QStringLiteral("gpxx:WaypointExtension"));
@@ -1295,10 +1295,48 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin
       if (waypointp->depth_has_value()) {
         writer->stackTextElement(QStringLiteral("gpxx:Depth"), toString(waypointp->depth_value()));
       }
+
+      if (garmin_fs_t::has_display(gmsd)) {
+        const char* cx;
+        switch (gmsd->display) {
+        case gt_display_mode_symbol:
+          cx = "SymbolOnly";
+          break;
+        case gt_display_mode_symbol_and_comment:
+          cx = "SymbolAndDescription";
+          break;
+        default:
+          cx = "SymbolAndName";
+          break;
+        }
+        writer->stackTextElement(QStringLiteral("gpxx:DisplayMode"), cx);
+      }
+
+      if (garmin_fs_t::has_category(gmsd)) {
+        uint16_t cx = gmsd->category;
+        writer->stackStartElement(QStringLiteral("gpxx:Categories"));
+        for (int i = 0; i < 16; i++) {
+          if (cx & 1) {
+            writer->stackTextElement(QStringLiteral("gpxx:Category"), QStringLiteral("Category %1").arg(i+1));
+          }
+          cx = cx >> 1;
+        }
+        writer->stackEndElement(); // gpxx:Categories
+      }
+
+      writer->stackOptionalStartElement(QStringLiteral("gpxx:Address"));
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:StreetAddress"), garmin_fs_t::get_addr(gmsd, nullptr));
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:City"), garmin_fs_t::get_city(gmsd, nullptr));
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:State"), garmin_fs_t::get_state(gmsd, nullptr));
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:Country"), garmin_fs_t::get_country(gmsd, nullptr));
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:PostalCode"), garmin_fs_t::get_postal_code(gmsd, nullptr));
+      writer->stackEndElement(); // gpxx:Address
+
+      writer->stackOptionalTextElement(QStringLiteral("gpxx:PhoneNumber"), garmin_fs_t::get_phone_nr(gmsd, nullptr));
+
       writer->stackEndElement(); // gpxx:WaypointExtension
       break;
-    case gpxpt_route: {
-      garmin_fs_t* gmsd = garmin_fs_t::find(waypointp);
+    case gpxpt_route:
       if (gmsd != nullptr && gmsd->ilinks != nullptr) {
         writer->stackOptionalStartElement(QStringLiteral("gpxx:RoutePointExtension"));
         garmin_ilink_t* link = gmsd->ilinks;
@@ -1315,8 +1353,7 @@ GpxFormat::gpx_write_common_extensions(const Waypoint* waypointp, const gpx_poin
         }
         writer->stackEndElement(); // gpxx:RoutePointExtension
       }
-    }
-    break;
+      break;
     case gpxpt_track:
       // gpxtpx:TrackPointExtension is a replacement for gpxx:TrackPointExtension.
       writer->stackOptionalStartElement(QStringLiteral("gpxtpx:TrackPointExtension"));
@@ -1387,23 +1424,8 @@ GpxFormat::gpx_waypt_pr(const Waypoint* waypointp) const
 
   if (!(opt_humminbirdext || opt_garminext)) {
     const auto* fs_gpx = reinterpret_cast<fs_xml*>(waypointp->fs.FsChainFind(kFsGpx));
-    auto* gmsd = garmin_fs_t::find(waypointp); /* gARmIN sPECIAL dATA */
-    if (fs_gpx) {
-      if (! gmsd) {
-        if (fs_gpx->tag) {
-          if (gpx_write_version > gpx_1_0) {
-            writer->writeStartElement("extensions");
-          }
-          fprint_xml_chain(fs_gpx->tag);
-          if (gpx_write_version > gpx_1_0) {
-            writer->writeEndElement();
-          }
-        }
-      }
-    }
-    if (gmsd && (gpx_write_version > gpx_1_0)) {
-      /* MapSource doesn't accepts extensions from 1.0 */
-      garmin_fs_xml_fprint(waypointp, writer);
+    if (fs_gpx && fs_gpx->tag) {
+      fprint_xml_chain(fs_gpx->tag);
     }
   } else {
     gpx_write_common_extensions(waypointp, gpxpt_waypoint);
@@ -1430,7 +1452,7 @@ GpxFormat::gpx_track_hdr(const route_head* rte)
     if (fs_gpx) {
       fprint_xml_chain(fs_gpx->tag);
     }
-  } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+  } else if (opt_garminext) {
     if (rte->line_color.bbggrr > unknown_color) {
       int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
       if (ci > 0) {
@@ -1518,7 +1540,7 @@ GpxFormat::gpx_route_hdr(const route_head* rte) const
     if (fs_gpx) {
       fprint_xml_chain(fs_gpx->tag);
     }
-  } else if (opt_garminext && (gpx_write_version > gpx_1_0)) {
+  } else if (opt_garminext) {
     if (rte->line_color.bbggrr > unknown_color) {
       int ci = gt_color_index_by_rgb(rte->line_color.bbggrr);
       if (ci > 0) {
diff --git a/gpx.h b/gpx.h
index 0fee9ae46d8a6e6566eb24e2bf8e1df29e89637e..a658404bac46a0ed167e98c1bbdad06ae46f1000 100644 (file)
--- a/gpx.h
+++ b/gpx.h
@@ -76,12 +76,12 @@ private:
    */
   struct gpx_wpt_fsdata : FormatSpecificData {
     gpx_wpt_fsdata() : FormatSpecificData(kFsGpxWpt) {}
-  
+
     gpx_wpt_fsdata* clone() const override
     {
       return new gpx_wpt_fsdata(*this);
     }
-  
+
     QString magvar;
     QString src;
     QString type;
@@ -200,8 +200,14 @@ private:
   };
 
   struct tag_mapping {
-    tag_type type{tt_unknown};         /* enum from above for this tag */
-    bool passthrough{true};            /* true if we don't generate this */
+    tag_type type{tt_unknown}; /* enum from above for this tag */
+    /*
+     * passthrough should be true for
+     * 1) The gpx 1.1 extensions element and any descendents.
+     * 2) Any element from a foreign (non gpx) namespace and any descendents.
+     *    This rule is necessary for gpx 1.0.
+     */
+    bool passthrough{true};
   };
 
 
@@ -373,29 +379,29 @@ private:
     {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:type", {tt_cache_log_type, true}},
     {"/gpx/wpt/groundspeak:cache/groundspeak:logs/groundspeak:log/groundspeak:date", {tt_cache_log_date, true}},
 
-    {"/gpx/wpt/extensions", {tt_wpt_extensions, false}},
+    {"/gpx/wpt/extensions", {tt_wpt_extensions, true}},
 
-    {GARMIN_WPT_EXT, {tt_garmin_wpt_extensions, false}},
-    {GARMIN_WPT_EXT "/gpxx:Proximity", {tt_garmin_wpt_proximity, false}},
-    {GARMIN_WPT_EXT "/gpxx:Temperature", {tt_garmin_wpt_temperature, false}},
+    {GARMIN_WPT_EXT, {tt_garmin_wpt_extensions, true}},
+    {GARMIN_WPT_EXT "/gpxx:Proximity", {tt_garmin_wpt_proximity, true}},
+    {GARMIN_WPT_EXT "/gpxx:Temperature", {tt_garmin_wpt_temperature, true}},
     {GARMIN_TRKPT_EXT "/gpxtpx:atemp", {tt_garmin_wpt_temperature, true}},
-    {GARMIN_WPT_EXT "/gpxx:Depth", {tt_garmin_wpt_depth, false}},
-    {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tt_garmin_wpt_display_mode, false}},
-    {GARMIN_WPT_EXT "/gpxx:Categories", {tt_garmin_wpt_categories, false}},
-    {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tt_garmin_wpt_category, false}},
-    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tt_garmin_wpt_addr, false}},
-    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tt_garmin_wpt_city, false}},
-    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tt_garmin_wpt_state, false}},
-    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tt_garmin_wpt_country, false}},
-    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tt_garmin_wpt_postal_code, false}},
-    {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tt_garmin_wpt_phone_nr, false}},
+    {GARMIN_WPT_EXT "/gpxx:Depth", {tt_garmin_wpt_depth, true}},
+    {GARMIN_WPT_EXT "/gpxx:DisplayMode", {tt_garmin_wpt_display_mode, true}},
+    {GARMIN_WPT_EXT "/gpxx:Categories", {tt_garmin_wpt_categories, true}},
+    {GARMIN_WPT_EXT "/gpxx:Categories/gpxx:Category", {tt_garmin_wpt_category, true}},
+    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:StreetAddress", {tt_garmin_wpt_addr, true}},
+    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:City", {tt_garmin_wpt_city, true}},
+    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:State", {tt_garmin_wpt_state, true}},
+    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:Country", {tt_garmin_wpt_country, true}},
+    {GARMIN_WPT_EXT "/gpxx:Address/gpxx:PostalCode", {tt_garmin_wpt_postal_code, true}},
+    {GARMIN_WPT_EXT "/gpxx:PhoneNumber", {tt_garmin_wpt_phone_nr, true}},
 
     // In Garmin space, but in core of waypoint.
     {GARMIN_TRKPT_EXT "/gpxtpx:hr", {tt_trk_trkseg_trkpt_heartrate, true}},
     {GARMIN_TRKPT_EXT "/gpxtpx:cad", {tt_trk_trkseg_trkpt_cadence, true}},
 
-    {"/gpx/wpt/extensions/h:depth", {tt_humminbird_wpt_depth, false}}, // in centimeters.
-    {"/gpx/wpt/extensions/h:status", {tt_humminbird_wpt_status, false}},
+    {"/gpx/wpt/extensions/h:depth", {tt_humminbird_wpt_depth, true}},  // in centimeters.
+    {"/gpx/wpt/extensions/h:status", {tt_humminbird_wpt_status, true}},
 
     {"/gpx/rte", {tt_rte, false}},
     {"/gpx/rte/name", {tt_rte_name, false}},
@@ -426,7 +432,7 @@ private:
     {"/gpx/trk/trkseg/trkpt/course", {tt_trk_trkseg_trkpt_course, false}},
     {"/gpx/trk/trkseg/trkpt/speed", {tt_trk_trkseg_trkpt_speed, false}},
 
-    {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tt_humminbird_trk_trkseg_trkpt_depth, false}},       // in centimeters.
+    {"/gpx/trk/trkseg/trkpt/extensions/h:depth", {tt_humminbird_trk_trkseg_trkpt_depth, true}},        // in centimeters.
 
     /* Common to tracks, routes, and waypts */
     GPXWPTTYPETAG("ele", tt_wpttype_ele, false),
index fe07c4a2185fb06573693bb129a1a1795cf98927..a40ffecca19ef68c1c3c78dddfdcacf8c742e92c 100644 (file)
     <sym>Flag, Blue</sym>
     <type>user</type>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+        <gpxx:Categories>
+          <gpxx:Category>Unlisted Data</gpxx:Category>
+        </gpxx:Categories>
       </gpxx:WaypointExtension>
     </extensions>
   </wpt>
     <sym>Flag, Blue</sym>
     <type>user</type>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+        <gpxx:Categories>
+          <gpxx:Category>Unlisted Data</gpxx:Category>
+        </gpxx:Categories>
       </gpxx:WaypointExtension>
     </extensions>
   </wpt>
index eb81cd6c7f8be763ee76f9c36944e629f943ba56..618c987ed8ee5deb8c63bd3cf6bd0a9d2cf502c0 100644 (file)
     <cmt>Birch Harbor</cmt>
     <desc>Birch Harbor</desc>
     <sym>City (Small)</sym>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+      </gpxx:WaypointExtension>
+    </extensions>
   </wpt>
   <wpt lat="44.477913380" lon="-68.038501740">
     <time>2020-06-08T18:35:58Z</time>
     <cmt>Gouldsboro</cmt>
     <desc>Gouldsboro</desc>
     <sym>City (Small)</sym>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+      </gpxx:WaypointExtension>
+    </extensions>
   </wpt>
   <wpt lat="44.409549236" lon="-68.025605679">
     <time>2020-06-10T22:00:50Z</time>
     <cmt>Prospect Harbor</cmt>
     <desc>Prospect Harbor</desc>
     <sym>City (Small)</sym>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+      </gpxx:WaypointExtension>
+    </extensions>
   </wpt>
   <wpt lat="44.380860329" lon="-68.068499565">
     <time>2020-06-08T11:09:27Z</time>
@@ -37,6 +52,19 @@ Schoodic Loop Rd
 Winter Harbor Twn, Maine, 04693, United States
 207-288-1300</desc>
     <sym>Campground</sym>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+        <gpxx:Address>
+          <gpxx:StreetAddress>Schoodic Loop Rd</gpxx:StreetAddress>
+          <gpxx:City>Winter Harbor Twn</gpxx:City>
+          <gpxx:State>Maine</gpxx:State>
+          <gpxx:Country>United States</gpxx:Country>
+          <gpxx:PostalCode>04693</gpxx:PostalCode>
+        </gpxx:Address>
+        <gpxx:PhoneNumber>207-288-1300</gpxx:PhoneNumber>
+      </gpxx:WaypointExtension>
+    </extensions>
   </wpt>
   <wpt lat="44.520120621" lon="-68.195464611">
     <time>2019-04-29T21:00:49Z</time>
@@ -44,6 +72,11 @@ Winter Harbor Twn, Maine, 04693, United States
     <cmt>Sullivan Twn</cmt>
     <desc>Sullivan Twn</desc>
     <sym>City (Small)</sym>
+    <extensions>
+      <gpxx:WaypointExtension>
+        <gpxx:DisplayMode>SymbolAndName</gpxx:DisplayMode>
+      </gpxx:WaypointExtension>
+    </extensions>
   </wpt>
   <rte>
     <name>Trip to Schoodic Woods Campground - Day 1</name>
index fcc2159d6866da9b6738f90952fbbdbe80ec7404..e76b718ece37ba692d03571eb2106fe14f0f90ce 100644 (file)
       <text>three dots</text>
     </link>
     <sym>Waypoint</sym>
-    <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
-        <gpxx:DisplayMode>SymbolAndDescription</gpxx:DisplayMode>
-      </gpxx:WaypointExtension>
-    </extensions>
   </wpt>
 </gpx>
index 2361b770c7832ee0d620876106775d5a76a6ac3a..096bfdd8d0f545d223297083d74aa260fc9ae74f 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8"?>
-<gpx version="1.1" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/1">
+<gpx version="1.1" creator="GPSBabel - https://www.gpsbabel.org" xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1">
   <metadata>
     <time>1970-01-01T00:00:00Z</time>
     <bounds minlat="47.545639984" minlon="4.290249981" maxlat="54.402619991" maxlon="16.385979988"/>
@@ -13,7 +13,7 @@
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Luitpoldstrasse</gpxx:StreetAddress>
           <gpxx:City>Freising</gpxx:City>
@@ -32,7 +32,7 @@
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Zeughausstrasse</gpxx:StreetAddress>
           <gpxx:City>Darmstadt</gpxx:City>
@@ -51,7 +51,7 @@
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Bretten / Grillplatz / B 35</gpxx:StreetAddress>
           <gpxx:City>Bretten</gpxx:City>
@@ -69,7 +69,7 @@
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Alter Elbtunnel / St. Pauli Landungsbrücken</gpxx:StreetAddress>
           <gpxx:City>Hamburg</gpxx:City>
@@ -88,7 +88,7 @@
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Heubergpark / Alte Roßmühlstraße</gpxx:StreetAddress>
           <gpxx:City>Wesel</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Prinzipalmarkt</gpxx:StreetAddress>
           <gpxx:City>Münster</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Frönsberg</gpxx:StreetAddress>
           <gpxx:City>Hemer</gpxx:City>
   </wpt>
   <wpt lat="49.799310034" lon="9.919969998">
     <name>Umsonst + Draußen Würzburg</name>
-    <cmt>Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr.</cmt>
-    <desc>Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mama s Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr.</desc>
+    <cmt>Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr.</cmt>
+    <desc>Line Up: Aeon of Decay, Aloha From Hell, Benni Hemm Hemm, Better Ones, Blocking Element, Bons Balls, Boppin B, Breakfast Killers, Brut Boogaloo, Diego, Enuff, Faint, Falling to Dust, Fiatonic, Frittenbude, Fuck your Shadow from behind, Fuenf, Ghost Rockets, Gold Minor, Guitar Challenge Spectacle, Hank Cash, Jamaze, Jane Doe, Jerry Lain, JZ James Trio, Karlsson, Kashiwa Daisuke, Mama Boom, Mamas Gun, Markus Rill, Melomania, Other Generations Anthem, Palpitation, Sam Isaac Acoustic Trio, Schöne Schaisse, Senore Matze Rossi, Signals to Airkraft, Sorrow Remains, Spaceship Bismark, Steffi-Mira-Band, Superpunk, Surfing Hundekuchen, Tequila Terminators, The Robocop Kraus, Unter Tagen, Vladiwoodstok, Worst Thoughts. Datum: 19.06. - 21.06.2009, Beginn: 17:00 Uhr.</desc>
     <link href="www.umsonst-und-draussen.de">
       <text>www.umsonst-und-draussen.de</text>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Talavera</gpxx:StreetAddress>
           <gpxx:City>Würzburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Kasernenstrasse</gpxx:StreetAddress>
           <gpxx:City>Bad Kissingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Solebadstrasse</gpxx:StreetAddress>
           <gpxx:City>Bad Salzdetfurth</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Zwischen Potsdamer und Berliner Ufer</gpxx:StreetAddress>
           <gpxx:City>Hamburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Parkanlage Stuttgart-Rohr</gpxx:StreetAddress>
           <gpxx:City>Stuttgart</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Himmelreichgelände bei den Hessenhöfen</gpxx:StreetAddress>
           <gpxx:City>Blaubeuren</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Ossenbergweg</gpxx:StreetAddress>
           <gpxx:City>Hünxe</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Rappenberghalde</gpxx:StreetAddress>
           <gpxx:City>Tübingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Ginsterweg</gpxx:StreetAddress>
           <gpxx:City>Bad Wildbad</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Zuiderpark</gpxx:StreetAddress>
           <gpxx:City>Den Haag</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Im Löwental</gpxx:StreetAddress>
           <gpxx:City>Essen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Neu-Isenburg</gpxx:StreetAddress>
           <gpxx:City>Neu-Isenburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:City>Straubenhardt</gpxx:City>
           <gpxx:PostalCode>75334</gpxx:PostalCode>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Hafenstraße</gpxx:StreetAddress>
           <gpxx:City>Hamm</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Heidjerstraße</gpxx:StreetAddress>
           <gpxx:City>Weener</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Altstadt</gpxx:StreetAddress>
           <gpxx:City>Iserlohn</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Günther-Klutz-Anlage</gpxx:StreetAddress>
           <gpxx:City>Karlsruhe</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Donauinsel</gpxx:StreetAddress>
           <gpxx:City>Wien</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Obstmarkt</gpxx:StreetAddress>
           <gpxx:City>Backnang</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Kohschultenhof</gpxx:StreetAddress>
           <gpxx:City>Lingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Falkenstein</gpxx:StreetAddress>
           <gpxx:City>Donnersdorf-Falkenstein</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Schloßberg</gpxx:StreetAddress>
           <gpxx:City>Pegnitz</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Firstwaldstrasse</gpxx:StreetAddress>
           <gpxx:City>Mössingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Weserwiese Veltheim</gpxx:StreetAddress>
           <gpxx:City>Vlotho</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Hintere Insel</gpxx:StreetAddress>
           <gpxx:City>Lindau</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Saupurzl</gpxx:StreetAddress>
           <gpxx:City>Karlstadt</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:City>Heubach</gpxx:City>
           <gpxx:PostalCode>73540</gpxx:PostalCode>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Volksfestplatz am Stadion</gpxx:StreetAddress>
           <gpxx:City>Erding</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:City>Südwinsen</gpxx:City>
           <gpxx:PostalCode>29308</gpxx:PostalCode>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Andlauer Weg</gpxx:StreetAddress>
           <gpxx:City>Berlin</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Freizeitpark Rheinaue</gpxx:StreetAddress>
           <gpxx:City>Bonn</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Stadionweg</gpxx:StreetAddress>
           <gpxx:City>Garching</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>im Lerchenfeld</gpxx:StreetAddress>
           <gpxx:City>Dornstadt bei Ulm</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Riedweg</gpxx:StreetAddress>
           <gpxx:City>Hausen am Andelsbach</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Karlsstraße</gpxx:StreetAddress>
           <gpxx:City>Reutlingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Noch nicht bekannt</gpxx:StreetAddress>
           <gpxx:City>Mönchengladbach</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Werratalsee</gpxx:StreetAddress>
           <gpxx:City>Schwebda</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Liebigstraße</gpxx:StreetAddress>
           <gpxx:City>Flörsheim</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Rathausplatz</gpxx:StreetAddress>
           <gpxx:City>Meldorf</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Innenstadt Nürnberg</gpxx:StreetAddress>
           <gpxx:City>Nürnberg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Innenstadt Regensburg</gpxx:StreetAddress>
           <gpxx:City>Regensburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Innenstadt Bochum</gpxx:StreetAddress>
           <gpxx:City>Bochum</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Schießmauer</gpxx:StreetAddress>
           <gpxx:City>Herrenberg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Firstwaldstrasse</gpxx:StreetAddress>
           <gpxx:City>Mössingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Weserwiese Veltheim</gpxx:StreetAddress>
           <gpxx:City>Vlotho</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Volksfestplatz am Stadion</gpxx:StreetAddress>
           <gpxx:City>Erding</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Moorfleeter Deich</gpxx:StreetAddress>
           <gpxx:City>Hamburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Geinsheimer Straße</gpxx:StreetAddress>
           <gpxx:City>Riedstadt-Leeheim</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>An den St Pauli Landungsbrücken</gpxx:StreetAddress>
           <gpxx:City>Hamburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Pfaffenwaldring</gpxx:StreetAddress>
           <gpxx:City>Stuttgart</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Koppelbergstrasse</gpxx:StreetAddress>
           <gpxx:City>Teterow</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Ilweder Strasse</gpxx:StreetAddress>
           <gpxx:City>Stemwede-Haldem</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Festivalgelände</gpxx:StreetAddress>
           <gpxx:City>Bakum (Büschel)</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Schlossstraße</gpxx:StreetAddress>
           <gpxx:City>Hofheim</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Oberransbach</gpxx:StreetAddress>
           <gpxx:City>Feuchtwangen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Rheinufer/In der Reduit</gpxx:StreetAddress>
           <gpxx:City>Mainz-Kastel</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Römersee</gpxx:StreetAddress>
           <gpxx:City>Bad Rappenau-Zimmerhof</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Vestische Straße</gpxx:StreetAddress>
           <gpxx:City>Oberhausen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Thomasstrasse</gpxx:StreetAddress>
           <gpxx:City>Halver</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Werdensteinstrasse</gpxx:StreetAddress>
           <gpxx:City>Dellmensingen bei Ulm</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Holter Straße</gpxx:StreetAddress>
           <gpxx:City>Schloß Holte-Stukenbrock</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Gogenkrog</gpxx:StreetAddress>
           <gpxx:City>Neustadt in Holstein</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Höllchenstrasse</gpxx:StreetAddress>
           <gpxx:City>Dörnberg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>An der alten Kirche</gpxx:StreetAddress>
           <gpxx:City>Krefeld</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Kennedyplatz</gpxx:StreetAddress>
           <gpxx:City>Essen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Peschmannstrasse</gpxx:StreetAddress>
           <gpxx:City>Duisburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Am Steinchen</gpxx:StreetAddress>
           <gpxx:City>Neu-Anspach</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Grindelhof/Siemersallee/Allendeplatz</gpxx:StreetAddress>
           <gpxx:City>Hamburg</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Flögger Strand</gpxx:StreetAddress>
           <gpxx:City>Fehmarn</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>Treuchtlingen Ri. Möhren, links Ri. Haag</gpxx:StreetAddress>
           <gpxx:City>Treuchtlingen</gpxx:City>
     </link>
     <sym>Waypoint</sym>
     <extensions>
-      <gpxx:WaypointExtension xmlns:gpxx="http://www.garmin.com/xmlschemas/GpxExtensions/v3">
+      <gpxx:WaypointExtension>
         <gpxx:Address>
           <gpxx:StreetAddress>An den Klärteichen</gpxx:StreetAddress>
           <gpxx:City>Emsdetten</gpxx:City>
index a58c3b1759bd0b2c9a2edb0d770cbdcea706cae1..57faa09361365dfcc00c4ba01b6c68b68b341982 100644 (file)
@@ -17,7 +17,7 @@ compare ${REFERENCE}/gpi_ext-sample.csv ${TMPDIR}/gpi_ext-sample.csv
 
 # Don't test writing this sample file from garminonline.de/extras/poi, but 
 # prove we can read it
-gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,gpxver=1.1 -F ${TMPDIR}/umsonstdraussen.gpx
+gpsbabel -i garmin_gpi -f ${REFERENCE}/umsonstdraussen.gpi -o gpx,garminextensions -F ${TMPDIR}/umsonstdraussen.gpx
 compare ${REFERENCE}/umsonstdraussen.gpx ${TMPDIR}/umsonstdraussen.gpx
 
 # look for differences between latin1 and windows-1252